﻿//-------------------------------------------------------------------------
///-----------------TaskMgr------------------------------------------------
///-----------------任务管理器---------------------------------------------
//-------------------------------------------------------------------------
#pragma once

//-------------------------------------------------------------------------
#ifndef _CLASS_TaskMGR_H
#define _CLASS_TaskMGR_H

//-------------------------------------------------------------------------------------
//#include "common/global_include.h"
#include "common/mvPubApi.h"
#include "cmd/video_stream/videoControl.h"
//-------------------------------------------------------------------------------------
namespace mv {
	//-------------------------------------------------------------------------------------
	class TaskMgr:public Singleton<TaskMgr> {
		DECL_CLASSNAME(TaskMgr)
		DECL_SINGLETON(TaskMgr)

	public:
		~TaskMgr();
	public:
		bool m_bPauseThread = false;		//心跳线程的停止

		bool m_bUDPConnect = false;

		inline toolkit::ThreadPool* getTasIpcPool() {
			return m_pTasIpcPool;
		}
		inline toolkit::ThreadPool* getTaskResultPool() {
			return m_pTaskResultPool;
		}

/*
 * @brief initListionTask
 * 初始化push 共享内存 配置参数任务进程
 * @param null
 */
		void initListionTask();
//-------------------------------------------------------------------------

/*
 * @brief initCfgTask
 * 初始化配置参数
 * @param null
 */
		void initCfgTask();
//-------------------------------------------------------------------------

/*
 * @brief initTaskParameter
 * 流程复位初始化参数
 * @param null
 */
		void initTaskParameter();
//-------------------------------------------------------------------------

/*
 * @brief initHeartbeatTasks
 * 初始化心跳线程
 * @param null
 */
		void initHeartbeatTasks();
//-------------------------------------------------------------------------

/*
 * @brief backToSwipeProcess
 * 从人脸虹膜流程返回刷证流程
 * @param null
 */
		void backToSwipeProcess();
//-------------------------------------------------------------------------

/*
 * @brief backToEnterPeopleProcess
 * 从刷证页面返回按键人数流程
 * @param null
 */
		void backToEnterPeopleProcess();
//-------------------------------------------------------------------------

/*
 * @brief clearImageData
 * 初始化缓存图片数据
 * @param null
 */
		void clearImageData();
//-------------------------------------------------------------------------

/*
 * @brief receiveServiceData
 * 接收push通讯类型 命令 命令数据
 * @param iType 通讯类型 iCmd 命令状态 sRevData 协议关键数据
 */
		void receiveServiceData(const int iType, const int iCmd, const std::string sRevData);
//-------------------------------------------------------------------------

/*
 * @brief receivePushConnStatus
 * udp push连接状态解析
 * @param bConnect udp push通讯连接状态
 */
		void receivePushConnStatus(bool bConnect);
//-------------------------------------------------------------------------

/*
 * @brief awtkUISwitch
 * udp awtk界面切换 以及 关键流程状态位复位
 * @param bConnect udp push通讯连接状态
 */
		void awtkUISwitch(const int iCmd);
//-------------------------------------------------------------------------

/*
 * @brief processSwitch
 * 一体柜流程开启 采集蛋复位
 * @param iCmd 开始 复位 iHeight 左舵升降伸缩时高度
 */
		void processSwitch(const int iCmd, const int iHeight);
//-------------------------------------------------------------------------

/*
 * @brief receiveSharememoryData
 *接收共享内存业务消息解析
 * @param iType 硬件控制、人脸虹膜类型 sData 返回数据解析
 */
		void receiveSharememoryData(const int iType, const std::string sData);
//-------------------------------------------------------------------------

/*
 * @brief parseOCRConnctStatus
 *OCR连接状态解析
 * @param bConnect 连接状态
 */
		void parseOCRConnctStatus(bool bConnect);
//-------------------------------------------------------------------------

/*
 * @brief parseOCRStatus
 *OCR放开，移开状态以及OCR数据解析
 * @param iStatus 2读取中 3读取完成 数据解析
 */
		void parseOCRStatus(const int iStatus);
//-------------------------------------------------------------------------

/*
 * @brief parseAcquisitionCabinetStatus
 *下位机连接状态解析
 * @param bConnect false断开 true连接
 */
		void parseAcquisitionCabinetStatus(bool bConnect);
//-------------------------------------------------------------------------

/*
 * @brief parseDocInfo
 *OCR读取数据结果分析
 * @param sData 解析数据
 */
		void parseDocInfo(const std::string sData);
//-------------------------------------------------------------------------

/*
 * @brief onceThreadFunc
 *单次线程函数
 * @param iCmd 切换界面id
 */
		void onceThreadFunc(const int iCmd);
//-------------------------------------------------------------------------

/*
 * @brief triggerOnceThread
 *单次线程函数
 * @param iFunc 切换界面id
 */
		void triggerOnceThread(const int iFunc);
//-------------------------------------------------------------------------

/*
 * @brief sendHttpRequest
 *请求返回上传图片加密数据
 * @param iFlag 图片类型
 */
		std::string sendHttpRequest(const int iFlag);
//-------------------------------------------------------------------------

/*
 * @brief uploadOcrInfo
 *push上传OCR数据
 * @param iFlag 0超时 1成功 sInfo 证件数据
 */
		void uploadOcrInfo(const int iFlag, const std::string sInfo);
//-------------------------------------------------------------------------

/*
 * @brief ocrProcessTimeOutEvent
 *OCR刷取流程超时、取回超时线程
 * @param null
 */
		void ocrProcessTimeOutEvent();
//-------------------------------------------------------------------------

/*
 * @brief ocrTakeawayEvent
 *OCR取回流程切换
 * @param iFlag 0开始证件取回超时计时 1取证超时,切验放页面
 */
		void ocrTakeawayEvent(const int iFlag);
//-------------------------------------------------------------------------

	private:
		#define	MIN_LEN 40
		typedef struct ocr_info
		{
    		int antifakeLabel;                  							 // 防伪标志
			unsigned char  eDocType[MIN_LEN];        // 证件类型
			//unsigned char Name[MIN_LEN];         		// 姓名  
			unsigned char NameFrist[MIN_LEN];    	// 姓
			unsigned char NameSecond[MIN_LEN]; // 名
			unsigned char Birthday[MIN_LEN];     	   // 出生日期
			unsigned char DateOfExpiry[MIN_LEN]; // 有效截至日期
			unsigned char Nationality[MIN_LEN];     // 持证人国籍
			unsigned char CardId[MIN_LEN];              // 证件号码
			unsigned char Sex[MIN_LEN];                    // 性别
		} ocr_info_t;

		typedef struct cfg_info {
			int iDevDirect = 0;							//设备安装位置
			int iCardReadTimeout = 120; //刷证流程超时时间
			int iTakeAwayCardTimeout = 60;//取回证件超时时间
			int iCarWindowDetect = 0;		 //车窗检测流程开启
			int iPushPort = 0;							//push服务端口
			int iPlatformPort = 0;					//platform端口
			std::string sLocalIP = "";		   //设备本地IP
			std::string sTerminalMac = "";//设备MAC地址
			std::string sPushIP = "";			//push通讯IP
			std::string sPlatformIP = "";	//platform后台IP
			std::string sPlatformInterface = "";	//platform后台接口
		}cfg_info_t;

		typedef struct pic_info {
			std::string m_sIrisLeftPic = "";//左眼虹膜图片上传后的接口
			std::string m_sIrisRightPic = "";//右眼虹膜图片上传后的接口
			std::string m_sFacePic = ""; //人脸图片上传后返回的接口
			std::string m_sIrisPic = ""; //虹膜图片上传后返回的接口
			std::string m_sIDPhotoPic = ""; //证件照片接口
			std::string m_sFaceScreenPic = ""; //人脸截图接口
			std::string m_sElectronicPic = ""; //电子照片接口
		}pic_info_t;

		enum DeviceStatus{
			OCR_PutOn =1,                  	   //证件放上
			OCR_Scanning,               	//证件读取中
			OCR_Removed,                  //证件移开
    	};

//各图片推送后返回加密字符串
		enum HttpRequestPic{
			Request_Face = 1,				//人脸图片
			Request_Iris,						  //虹膜图片
			Request_IrisLeft,				  //左眼虹膜
			Request_IrisRight,				//右眼虹膜
			Request_IDPhoto,			   //可见光证件
			Request_FaceScrshot,	   //证件人脸区域
			Request_Electronic,			  //电子证件照片
		};

		//各图片推送后返回加密字符串
		enum LightStatus{
			Light_Close = 0,				//关灯
			Light_Red,						  	//红灯
			Light_Green,				  	 //绿灯
			Light_White,					 //白灯
		};

		bool m_bOpenIrisCamera = false;	//虹膜流程是否开启
		bool m_bWaitingRelease = false;//待验放状态
		bool m_bResetProcess = false;	 //收到采集蛋复位状态
		bool m_bResetCollectionEgg = false;	  //是否已复位采集蛋
		bool m_bPauseOCRThread = true;		  //是否暂停OCR超时线程
		bool m_bOcrTimeOProcess = false;	 //是否进入OCR超时计时流程
		bool m_bTakeAwayPassport = false;   //是否进入拿走证件提示流程
		bool m_bOCRConnect = false;				  //OCR当前连接状态
		bool m_bAcquisitionCab = false;			 //下位机当前状态
		bool m_bProcessStart = false;				//流程开始状态
		int m_iCurrentProcess = -1;					   //当前流程
		int m_iLeftHighAltitude = -1;				  //左舵高度,同步给左舵用到
		int m_iOCRState = -1;				   				 //OCR当前读取状态
		int m_iOCRDeviceState = -1;	   				 //OCR硬件状态
		int m_iOcrCurntTimeInc = 0;					//当前刷证计时数
		int m_iTakeAwIDInc = 0;							  //当前提示拿走证件提示
		int m_iNumberOfPerson = 1;	 			  //当前流程验证人数
		int m_iStartNumOfPerson = 0;			 //按人数之前补录的人数
		int m_iCachedProcess = 0;					  //用于证件未拿走，验放后，对已放行指令进行判断
		int m_iPeopleNumTest = 1;					 //按键人数测试
		std::string m_sVehicleNo = "";				//车牌号

		cfg_info_t cfgInfo;
		ocr_info_t ocrInfo;
		pic_info_t picInfo;

		std::mutex m_mutex;
		toolkit::ThreadPool* m_pTasIpcPool = nullptr; //工作池
		toolkit::ThreadPool* m_pTaskResultPool = nullptr; //结果回复池 
		//-------------------------------------------------------------------------------------
	};

	//-------------------------------------------------------------------------------------
}
//-------------------------------------------------------------------------
#endif //!_CLASS_TaskMGR_H
